﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PresentacionWindows.Base;
using Negocio.Generico;
using Negocio.View;
using Integra.Comun;
using System.IO;

namespace PresentacionWindows
{
    public partial class frmRenglon : FormBase
    {
        #region Atributos

        private int? coAsignatura;

        private bool bEdicion = false;

        private int? coRenglon;

        private bool bRequerido = false;

        private bool bDocumentosAñadidos = false;

        private bool consulta = false;





        private List<DocumentacionReqDTO> listaDocumentos = new List<DocumentacionReqDTO>();

        #endregion

        #region propiedades


        public bool Consulta
        {
            get { return consulta; }
            set { consulta = value; }
        }

        /// <summary>
        /// Obtiene o establece el codigo de la asignatura
        /// </summary>
        public int? CoAsignatura
        {
            get { return coAsignatura; }
            set { coAsignatura = value; }
        }

        public int? CodigoRenglon
        {
            get { return coRenglon; }
            set { coRenglon = value; }
        }

        public bool BEdicion
        {
            get { return bEdicion; }
            set { bEdicion = value; }
        }

        public bool BDocumentosAñadidos
        {
            get { return bDocumentosAñadidos; }
            set { bDocumentosAñadidos = value; }
        }

        #endregion

        #region  Incializacion,Constructor,etc


        public frmRenglon(RenglonDTO filtro,bool esConsulta)
        {
            Consulta = esConsulta;
            this.CoAsignatura = filtro.CoAsignatura;
            bEdicion = (filtro.CoRenglon == null) ? false : true;
            CodigoRenglon = filtro.CoRenglon;
            InitializeComponent();
            DsToBinding();

            if (Consulta) 
            {
                foreach (Control crtl in this.Controls) 
                {
                    crtl.Enabled = false;
                }
                btnCerrarRenglon.Enabled = true;
                tcDocumentos.Enabled = true;
            }
        }


        #endregion

        #region funciones propias

        private void DsToBinding()
        {
            //Cargamos los combos
            ControlDatos.CargarCombo(cboTipoRenglon, typeof(TipoRenglon), TipoCargaCombo.Normal);

            if (bEdicion)
            {
                RenglonView vista = RenglonView.GetInstance();
                RenglonDTO filtro = new RenglonDTO();
                filtro.CoRenglon = CodigoRenglon;
                DataTable dt = vista.GetViewRenglon(filtro).Table;

                if (dt.Rows.Count == 1)
                {
                    DataRow dr = dt.Rows[0];
                    this.txtTitulo.Text = dr["NOMBRE"].ToString();
                    this.cboTipoRenglon.SelectedValue = Int32.Parse(dr["CODIGOTIPORENGLON"].ToString());
                    this.dtFchCreacion.Value = Convert.ToDateTime(dr["FECHACREACION"].ToString());
                    if (bRequerido)
                    {
                        this.dtFchRequerimiento.Value = Convert.ToDateTime(dr["FECHAREQUERIMIENTO"].ToString());
                    }
                    this.chkPublica.Checked = Convert.ToBoolean(dr["PUBLICO"].ToString());
                    this.rtcDescripcion.Text = dr["DESCRIPCION"].ToString();
                }

                //Carga de los documentos
                RecargaGrid();
            }

        }

        private void BindingToDs()
        {
            RenglonDTO obj = new RenglonDTO();
            if (bEdicion) { obj.CoRenglon = CodigoRenglon; }
            obj.Nombre = this.txtTitulo.Text;
            obj.CoTipoRenglon = Int32.Parse(this.cboTipoRenglon.SelectedValue.ToString());
            obj.CoAsignatura = this.CoAsignatura;
            obj.Descripcion = this.rtcDescripcion.Text;
            obj.Publico = this.chkPublica.Checked;
            obj.FchRequerimiento = (DateTime)this.dtFchRequerimiento.Value;
            obj.FchCreacion = (DateTime)this.dtFchCreacion.Value;

            GenericaView vista = GenericaView.GetInstance();
            if (!bEdicion)
            {
                if (vista.Inserta(obj))
                {
                    MessageBox.Show("Se ha insertado de forma correcta el renglon");
                    //Si se ha insertado de forma correcta el renglon tenemos que crear un 
                    // Renglon_Documentacion por cada alumno
                    RenglonDocumentacionDTO filtro = new RenglonDocumentacionDTO();
                    filtro.CoAlumno = TokenUsuario.CoAlumno;

                    if (vista.Inserta(filtro)) 
                    {
                        //Se ha insertado con exito el renglon documentación.
                    }
                }
            }
            else 
            {
                if (vista.Actualiza(obj))
                {
                    MessageBox.Show("Se ha actualizado de forma correcta el renglon");
                }
            }

            if (!bEdicion)
            {
                //Guardamos los documentos que se hayan podido añadir a la lista
                foreach (DocumentacionReqDTO documento in listaDocumentos) 
                {
                    if (!vista.Inserta(documento)) 
                    {
                        break;
                    }
                }
            }
            this.Close();
        }

        private DocumentacionReqDTO BindingToDsDocumento()
        {
            DocumentacionReqDTO obj = null;
            try
            {
                obj = new DocumentacionReqDTO();
                obj.Descripcion = this.txtDescripcion.Text;
                obj.NombreDoc = this.txtNombreDocumento.Text;

                //ahora vamos a rellenar el fichero
                FileStream fs = new FileStream(this.txtrutaDocumento.Text, FileMode.Open);
                byte[] vector = new byte[fs.Length];
                fs.Write(vector, 0, (int)fs.Length);
                obj.Contenido = vector;
                obj.Path = this.txtrutaDocumento.Text;
                if (CodigoRenglon != Int32.MinValue) 
                {
                    obj.CoRenglon = CodigoRenglon;
                }
            }
            catch (Exception ex)
            {
                this.MostrarExcepcion(ex);
            }
            return obj;
        }

        /// <summary>
        /// Valida si se han rellenado todos los datos del documento
        /// </summary>
        /// <returns></returns>
        private bool ValidaDocumento()
        {
            if (this.txtNombreDocumento.Text != "" && this.txtNombreDocumento.Text != "" && this.txtDescripcion.Text != "")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void RecargaGrid()
        {
            DocumentacionReqDTO filtro = new DocumentacionReqDTO();
            filtro.CoRenglon = CodigoRenglon;
            RecargaGrid(filtro);
        }

        /// <summary>
        /// Método que recarga el grid por completo 
        /// </summary>
        private void RecargaGrid(DocumentacionReqDTO filtro)
        {
            try
            {
                DocumentacionReqView vista = DocumentacionReqView.GetInstance();
                DocumentacionReqDTO dto;
                if (filtro == null)
                {
                    dto = new DocumentacionReqDTO();
                }
                else
                {
                    dto = filtro;
                }
                this.grdDocumentos.DataSource = null;
                this.grdDocumentos.DataSource = vista.GetDocumentacionReqView(dto);
                this.grdDocumentos.Refresh();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
        }

        /// <summary>
        /// Funcion que almacena el documento en la lista
        /// </summary>
        private void BindingToListaDocumento()
        {
            try
            {
                RenglonDocumentacionDTO objeto = new RenglonDocumentacionDTO();
            }
            catch (Exception ex)
            {
                this.MostrarExcepcion(ex);
            }
        }

        /// <summary>
        /// Funcion que limpia todos los controles relativos al documento
        /// </summary>
        private void LimpiaControlesDoc() 
        {
            this.txtNombreDocumento.Text = "";
            this.txtrutaDocumento.Text = "";
            this.txtDescripcion.Text = "";
        }


        #endregion

        #region Eventos

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            BindingToDs();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            //Stream flujo = (Stream)e.Argument;
            //byte[] buffer = new byte[flujo.Length]; // OJO: esto consume memoria.
            try
            {

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error en la carga de documento. Excepcion: " + ex.Message);
            }
        }

        private void cboTipoRenglon_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Establecemos laas funcionalidadaes en funcion de los valores del tipo de renglon
            switch (Int32.Parse(this.cboTipoRenglon.SelectedValue.ToString()))
            {
                case (int)TipoRenglon.Informativo:
                    this.chkPublica.Checked = true;
                    this.dtFchRequerimiento.Enabled = false;
                    this.bRequerido = false;
                    this.label3.Text = "Fecha Req.:";
                    break;

                case (int)TipoRenglon.Mensaje:
                    this.bRequerido = false;
                    //this.dtFchRequerimiento.Value=
                    this.label3.Text = "Fecha Req.:";
                    break;

                case (int)TipoRenglon.Practicas:
                    this.dtFchRequerimiento.Enabled = true;
                    this.chkPublica.Checked = true;
                    this.chkPublica.Enabled = false;
                    this.bRequerido = true;
                    this.label3.Text = "Fecha Req.";
                    break;
                case (int)TipoRenglon.Examen:
                    this.chkPublica.Checked = true;
                    this.chkPublica.Enabled = false;
                    this.dtFchRequerimiento.Enabled = true;
                    this.label3.Text = "Fecha de Examen:";
                    break;
            }
        }

        private void btnOpenDialog_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.ofdDocumento.ShowDialog() == DialogResult.OK)
                {
                    this.txtrutaDocumento.Text = this.ofdDocumento.FileName;
                }
            }
            catch (Exception ex)
            {
                this.MostrarExcepcion(ex);
            }
        }

        private void btnGuardaDocumento_Click(object sender, EventArgs e)
        {
            if (ValidaDocumento())
            {
                DocumentacionReqDTO obj = BindingToDsDocumento();
                GenericaView objGen = GenericaView.GetInstance();
                if (bEdicion)
                {
                    if (objGen.Inserta(obj))
                    {
                        MessageBox.Show("Se ha insertado correctamente el documento");
                    }
                }
                else 
                {
                    listaDocumentos.Add(BindingToDsDocumento());
                    BDocumentosAñadidos=true;
                }
                LimpiaControlesDoc();
                RecargaGrid();
            }
        }

        private void btnCerrar_Click(object sender, EventArgs e)
        {
            try
            {

                DocumentacionReqDTO filtro = new DocumentacionReqDTO();
                filtro.CoDocumentacionReq = Int32.Parse(this.grdDocumentos.SelectedRows[0].Cells["CODIGODOCUMENTACIONREQ"].ToString());
                GenericaView vista = GenericaView.GetInstance();
                if (vista.Elimina(filtro)) 
                {
                    MessageBox.Show("Se ha eliminado correctamente la asignatura");
                    RecargaGrid();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al eliminar el documento.Excepcion:" + ex.Message);
            }
        }

        private void btnCerrarRenglon_Click(object sender, EventArgs e)
        {
            if (BDocumentosAñadidos) 
            {

            }
            this.Close();
        }

        #endregion   
    }
}
